import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

public class NUR extends Strategy {
	List<Point> memoria = new ArrayList<Point>();
	int intervalo;

	public NUR(int numFrames, List<Request> requests, int bitR) {
		super(numFrames, requests, bitR);
		intervalo = bitR;
	}

	public void run() {
		int tempo = 0;
		Point pagina;
		for (Request operacao : requests) {
			if (tempo >= intervalo) {
				zeraBitR();
				tempo = 0;
			}
			if (operacao.type == 'W') {
				pagina = new Point(operacao.value, 3);
			} else {
				pagina = new Point(operacao.value, 2);
			}
			int posicao = getPosicaoPagina(pagina);
			if (posicao < 0) {
				if (memoria.size() < frameSize) {
					memoria.add(pagina);
				} else {
					removePagina();
					memoria.add(pagina);
				}
			} else {
				Point paginaMen = memoria.get(posicao);
				if (paginaMen.y < 2) {
					paginaMen.y = paginaMen.y + 2;
				}
				if (pagina.y < paginaMen.y) {
					pagina.y = paginaMen.y;
				}
				memoria.get(posicao).y = pagina.y;
				hit++;
			}
			tempo++;
		}
	}

	static String getName() {
		return "NUR";
	}

	public void reset() {
		hit = 0;
		memoria = new ArrayList<Point>();
	}

	private void removePagina() {
		ArrayList<Integer> menorClasse = new ArrayList<Integer>();
		for (int i = 0; i <= 3; i++) {
			menorClasse.add(-1);
		}
		int classe;
		for (int i = 0; i < memoria.size(); i++) {
			classe = memoria.get(i).y;
			if (menorClasse.get(classe) == -1) {
				menorClasse.set(classe, i);
			}
		}
		int posicao = -1;
		for (int i = 0; i <= 3; i++) {
			if (posicao == -1 && menorClasse.get(i) > -1) {
				posicao = menorClasse.get(i);
			}
		}
		memoria.remove(posicao);
	}

	void zeraBitR() {
		for (int i = 0; i < memoria.size(); i++) {
			if (memoria.get(i).y > 1) {
				memoria.get(i).y = memoria.get(i).y - 2;
			}
		}
	}

	int getPosicaoPagina(Point pagina) {
		for (int i = 0; i < memoria.size(); i++) {
			if (memoria.get(i).x == pagina.x) {
				return i;
			}
		}

		return -1;
	}
}
